local class = reload("class")
local btreet = reload("btreet")
local reverse = reload("reverse")

---生成全局唯一订单号
local function gorder(sid)
    -- =====================
    -- 字段分布说明（总长度16位）：
    -- [1-10位] 反转时间戳（保证降序）
    -- [11-14位] 自增序列（1~9999循环）
    -- [15-16位] 线路序列
    -- =====================

    -- 自增序列处理（1~9999循环）
    cid = cid or 0
    cid = cid < 9999 and (cid + 1) or 1

    -- 获取当前时间戳（秒级）
    local now = os.time()

    local time_part = now * 1000000 -- 左移6位

    -- gmsv线路部分处理
    local cid_part = cid * 100

    -- 组合订单号
    return time_part + cid_part + sid
end

---@class tradeShop @交易商品
---@field order   number  @商品订单(zone* + sid * )
---@field id      number  @商品标识
---@field count   number  @商品数量
---@field tcost   number  @售价货币
---@field price   number  @商品单价
---@field ctime   number  @上架时间
---@field item    string  @道具数据msgpack
---@field pet     string  @宠物数据msgpack
---@field view    string  @前端展示protobuf

---@class tradeBank @交易行
local this = class()

function this:ctor(sid)
    self._sid = sid
    self._inf_shop = {} -- 商品映射表 {order = tradeShop}
    self._sum_iden = {} -- 标识统计 {id = count}
    self._sum_find = {} -- 搜索类型统计 {find = count}

    --- 多个索引查询
    self._idx_order = btreet.new() -- 订单索引
    self._idx_id = btreet.new()    -- 标识索引
    self._idx_ctime = btreet.new() -- 时间索引
    self._idx_tcost = btreet.new() -- 货币索引
    self._idx_price = btreet.new() -- 价格索引
    self._idx_finds = btreet.new() -- 搜索类型
end

--- 上架商品
function this:add(order, shop)
    -- 订单号冲突检查
    if self._inf_shop[order] then
        return false, "订单号已存在"
    end

    -- 存储主数据
    self._inf_shop[order] = shop

    -- 更新统计信息
    self._sum_iden[shop.id] = (self._sum_iden[shop.id] or 0) + 1
    self._sum_find[shop.find] = (self._sum_find[shop.find] or 0) + 1

    -- 更新索引系统
    self._idx_order:insert(order, order) -- 订单索引

    -- 标识索引
    self._idx_id:insert(shop.id, shop)

    -- 时间索引
    self._idx_ctime:insert(shop.ctime, shop)

    -- 货币价格索引
    self._idx_tcost:insert(shop.tcost, shop)

    -- 价格索引
    self._idx_price:insert(shop.price, shop)

    -- 搜索类型
    for _, find in pairs({}) do
        self._idx_finds:insert(find, shop)
    end

    return true
end

--- 下架商品
function this:del(order)
    local shop = self._inf_shop[order]
    if not shop then return false end

    -- 删除统计信息
    self._sum_iden[shop.id] = (self._sum_iden[shop.id] or 1) - 1
    self._sum_find[shop.find] = (self._sum_find[shop.find] or 1) - 1

    -- 删除索引
    self._idx_order:erase(order, "order", order)
    self._idx_id:erase(shop.id, "order", order)
    self._idx_ctime:erase(shop.ctime, "order", order)
    self._idx_tcost:erase(shop.tcost, "order", order)
    self._idx_price:erase(shop.price, "order", order)

    -- 搜索类型
    for _, find in pairs({}) do
        self._idx_finds:erase(find, "order", order)
    end

    -- 删除主数据
    self._inf_shop[order] = nil
    return true
end

--- 搜索商品
---@param finds string[] @搜索类型
---@param seles string[] @筛选条件
---@param page number @页码（从1开始）
---@param pageNum number @每页数量
---@return number, table @总数量, 当前页商品数据
function this:search(finds, seles, page, pageNum)
    local start = ((page - 1) * pageNum) + 1
    local close = start + pageNum
    return start, {}
end

return this
